import axios from 'axios'
import router from '@/router'
import { ElMessage } from 'element-plus'

// 创建一个 axios 实例
const service = axios.create({
  // // 所有的请求地址前缀部分
  // baseURL: '/api',
  // // 请求超时时间毫秒
  // timeout: 60000,
  // // 异步请求携带cookie
  // withCredentials: true,
  // // 设置后端需要的传参类型
  // headers: {
  //   'Content-Type': 'application/json',
  //   'token': 'your token',
  //   'X-Requested-With': 'XMLHttpRequest',
  // },
})

const cancelToken = axios.CancelToken
let source = cancelToken.source()

// 添加请求拦截器
service.interceptors.request.use(
  function (config) {
	// 在发送请求之前做些什么
	if (!config.headers?.satoken) {
	  let sess = sessionStorage.getItem('loginUserInfo')
	  if (sess) {
		let obj = JSON.parse(sess)
		let token = obj.token
		config.headers!.satoken = `${token}`
	  }
	}
	// 所有接口共享此cancelToken
	config.cancelToken = source.token
	return config
  },
  function (error) {
	// 对请求错误做些什么
	// console.log(error)
	return Promise.reject(error)
  }
)

// 添加响应拦截器
service.interceptors.response.use(
  function (response) {
	// 2xx 范围内的状态码都会触发该函数。
	// 对响应数据做点什么
	// dataAxios 是 axios 返回数据中的 data
	const dataAxios = response.data
	// 这个状态码是和后端约定的
	const code = dataAxios.code
	if (code === -1 && dataAxios.msg === '未提供有效的Token') {
	  ElMessage({
	    message: '登录状态已过期，请重新登录！',
	    type: 'error',
	    duration: 3000
	  })
	  sessionStorage.removeItem('loginUserInfo')
	  router.push({ name: 'Login', replace: true })
	  source.cancel('登录状态已过期')
	  source = cancelToken.source()
	  return Promise.reject()
	}
	// return dataAxios
	// console.log(response)
	return Promise.resolve(response.data)
  },
  function (error) {
	// 超出 2xx 范围的状态码都会触发该函数。
	// 对响应错误做点什么
	// console.log(error)
	switch (error.response.status) {
	  case 500:
		if (error.response.data.msg !== '登录状态已过期') {
		  break
		} else {
		  ElMessage({
			message: '登录状态已过期，请重新登录！',
			type: 'error',
			duration: 3000
		  })
		  sessionStorage.removeItem('loginUserInfo')
		  router.push({ name: 'Login', replace: true })
		  source.cancel('登录状态已过期')
		  source = cancelToken.source()
		  return Promise.reject()
		  break
		}
	  case 401:
		if (error.response.data.error === 'invalid_token') {
		  if (error.response.data.error_description.includes('Access token expired')) {
			ElMessage({
			  message: '登录状态已过期，请重新登录！',
			  type: 'error',
			  duration: 3000
			})
		  }
		}
		sessionStorage.removeItem('loginUserInfo')
		router.push({ name: 'Login', replace: true })
		source.cancel('登录状态已过期')
		// 取消同一个cancelToken的所有接口后，需要重新生成新的cancelToken，否则一直处于取消状态
		source = cancelToken.source()
	    return Promise.reject()
		break
	}
	return Promise.reject(error)
  }
)

export default service
